package com.lg.concurrent.pool.thread_pool;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 *   newScheduledThreadPool
 *   super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
 *               new DelayedWorkQueue());
 *
 *
 *  newScheduledThreadPool（n）
 * corePoolSize：n
 * maximumPoolSize： integer.max
 * keepAliveTime ：0
 * TimeUnit：ns  纳秒
 * workQueue： DelayedWorkQueue
 * 初始线程为n，最大线程数也是integer.max,，延迟队列内部数据结构是数组，容量最大为integer.max。
 * 并发高的时候会 将大量的任务加到阻塞队列汇中 造成oom ，应该还没到创建新的线程就oom了，因为要把integer.max个任务都放到队列中才会创建新的线程。
 *
 * 延迟队列 可以让任务 沿固定的时间执行
 * 提交任务 并设置延时执行的时间
 * 如果提交任务 到 从队列中拿到这个任务去执行， 这个期间的时间大于设置的延迟时间直接执行
 * 否自延迟到设置的时间才执行
 */
public class ScheduleThreadPoolTest {
    public static void main(String[] args) {
        Task task = new Task();
        Task task2 = new Task();
        Task task3 = new Task();

        ScheduledExecutorService p = Executors.newScheduledThreadPool(1);

        //和其他 线程池一样
//        p.execute(task);
//        p.execute(task2);
//        p.execute(task3);


        System.out.println("main start schedule");
        p.schedule(task,6, TimeUnit.SECONDS);
        p.schedule(task2,10, TimeUnit.SECONDS);
        p.schedule(task3,10, TimeUnit.SECONDS);
        System.out.println("main end schedule");



    }
}
